;(function(){
  'use strict';
  angular.module('services.omdisplay.busAssessment')
    .factory('ProvAssessServer',provAssessServer)
    .factory('ProvASelector',provASelector)
    .factory('ProvAQueryObj',provAQueryObj)
    .factory('ProvAViewObj',provAViewObj);
  /**
   * 对省考核查询服务
   * @param   Restangular 提供http请求
   */
  function provAssessServer(Restangular){
    return {
      provAssessQuery:provAssessQuery
    };
    /**
     * 对省考核查询
     * @param    param    查询参数
     * @param    callback 响应回调函数
     */
    function provAssessQuery(param,callback){
      Restangular.all('sas/OMdisplay/assessment/provincialQuery').post(param).then(callback);
    }
  }

  provAssessServer.$inject = ['Restangular'];
  /**
   * 对省考核下拉选择菜单集
   * @param   COREDATA   提供公共数据
   * @return             service实例
   */
  function provASelector(COREDATA){
    var businessLine = [];
    angular.copy(COREDATA.BUSINESSLINE,businessLine);
    businessLine.pop();
    businessLine.pop();
    var selector = {
      //业务线
      businessLineCode: businessLine,
      //账期
      timeType: COREDATA.TIMETYPES
    };

    return {
      selector:selector
    };
  }

  provASelector.$inject = ['COREDATA'];
  /**
   * 对省考核查询参数处理service
   * @param   ProvAssessServer     对省考核查询服务
   * @param   BusAssessmentService 业务侧考核service
   * @param   ProvAViewObj         页面数据展示service
   * @param   ProvASelector        下拉菜单选项service
   * @param   CoreService          提供核心公共服务
   * @return                       返回service实例
   */
  function provAQueryObj(ProvAssessServer,BusAssessmentService,ProvAViewObj,ProvASelector,CoreService,CoreLoading){
    //查询参数
    var param = {};
    //日期参数
    var date = {};
    //导出参数
    var exportParam = {};
    //查询操作联动标志
    var flag = {};
    //预定义银行总对总代码
    var bankCorporateCode = '2';

    return{
      getQueryParam:getQueryParam,
      getDateParam:getDateParam,
      getExportParam:getExportParam,
      getFlag:getFlag,
      provAssessQueryFn:provAssessQueryFn
    };
    //获取查询参数对象
    function getQueryParam(){
      param = {quarter:{}};
      return param;
    }
    //获取日期参数对象
    function getDateParam(){
      if(param.timeType){
        date = BusAssessmentService.initDate(param.timeType.timeTypeCode);
      }else{
        date = BusAssessmentService.initDate('1');
      }
      return date;
    }
    //设置查询参数
    function setQueryParam(){
      //申明临时对象用来接收处理后的查询参数
      var tempParam = {};
      //日期转化格式
      var format;
      //下拉选项组
      var selector = ProvASelector.selector;
      //业务线处理
      if(param.businessLineCode){
        tempParam.businessLineCode = param.businessLineCode.businessLineCode;
      }else{
        tempParam.businessLineCode = bankCorporateCode;
      }

      //账期处理
      if(param.timeType){
        tempParam.timeType = param.timeType.timeTypeCode;
      }else{
        tempParam.timeType = selector.timeType[0].timeTypeCode;
      }

      //日期格式
      format = BusAssessmentService.FORMATARRAY[tempParam.timeType];

      //根据已选账期对日期参数处理
      if(param.timeType){
        switch(param.timeType.timeTypeCode){
          case '4':
            tempParam.startTime = param.quarter.startTime.substr(0,4)+'-01-01';
            tempParam.endTime = param.quarter.endTime.substr(0,4)+'-01-01';
            tempParam.startQuarter = param.quarter.startTime.substr(4,1);
            tempParam.endQuarter = param.quarter.endTime.substr(4,1);
            break;
          case '5':
            tempParam.startTime = date.startTime+'-01-01';
            tempParam.endTime = date.endTime+'-01-01';
            break;
          default :
            tempParam.startTime = CoreService.dateFormat(date.startTime,format);
            tempParam.endTime = CoreService.dateFormat(date.endTime,format);
        }
      }else{
        tempParam.startTime = CoreService.dateFormat(date.startTime,format);
        tempParam.endTime = CoreService.dateFormat(date.endTime,format);
      }

      //拷贝临时对象给导出参数
      angular.copy(tempParam,exportParam);
      return tempParam;
    }

    //获取导出参数
    function getExportParam(){
      return exportParam;
    }

    //获取页面控制标志
    function getFlag(){
      flag = {
        //查询表单是否收拢
        formIsFold:false,
        //业务线是否为银行总对总
        isBankCorporate:true,
        //是否显示列表
        showTable:false
      };
      return flag;
    }

    //对省考核查询方法
    function provAssessQueryFn(){
      //临时查询参数对象
      var tempParam = {};
      //响应返回数据
      var resData;
      //临时标志,为了页面标志延时
      var isBankCorporate;
      //如果表单为没收拢状态,则向下执行到查询操作
      if(!flag.formIsFold){

        //根据页面已选择查询参数生成新的查询参数
        tempParam = setQueryParam();
        //设置业务线标志,是否为银行总对总
        isBankCorporate = tempParam.businessLineCode === bankCorporateCode;
        //载入动画
        CoreLoading.setState(true);
        //调用对省考核服务提供的查询方法查询,并传入所需参数,返回查询到的数据
        ProvAssessServer.provAssessQuery(tempParam,function(res){
          //检查返回数据为空数据或状态码不为'10000'则弹出提示框并关闭loading动画
          if(res.state !== '10000' || ProvAViewObj.checkData(res.data,isBankCorporate)){
           flag.showTable = false;
            //关闭载入动画
            CoreLoading.setState(false);
            //弹出提示
            CoreService.dialog(res.state);
            return;
          }
          //设置交易返回码
          ProvAViewObj.setRsp(res.data,isBankCorporate);
          //设置数据
          ProvAViewObj.setSeries(res.data,isBankCorporate);
          //设置账期区间
          ProvAViewObj.setDuration(tempParam);
          //设置业务线标题
          ProvAViewObj.setTitle(param);
          //关闭载入动画
          CoreLoading.setState(false);
          //切换表单收拢状态
          flag.formIsFold = !flag.formIsFold;
          //显示列表
          flag.showTable = true;
          //银行总对总标志赋值
          flag.isBankCorporate = isBankCorporate;
        });
      }else{
        //切换表单收拢状态
        flag.formIsFold = !flag.formIsFold;
      }
    }
  }

  provAQueryObj.$inject = ['ProvAssessServer','BusAssessmentService','ProvAViewObj','ProvASelector','CoreService','CoreLoading'];
  /**
   * 对省考核页面展示service
   * @param   BusAssessmentService 业务侧考核service
   */
  function provAViewObj(BusAssessmentService){
    //数据对象
    var viewObj = {
      //数据系列
      series:{},
      //交易返回码
      rsp:{},
      //账期区间
      duration:'',
      //业务线名称
      title:''
    };
    //交易类型
    var tradeType = {
      //缴费
      payment:'00',
      //充值
      recharge:'01',
      //签约
      constract:'02'
    };

    return{
      checkData:checkData,
      getTradeType:getTradeType,
      getViewObj:getViewObj,
      setDuration:setDuration,
      setRsp:setRsp,
      setSeries:setSeries,
      setTitle:setTitle
    };
    function setTitle(param){
      if(param.businessLineCode){
        viewObj.title = param.businessLineCode.businessLineName;
      }
      return viewObj.title;
    }
    /**
     * 监测数据由后台传入是否可用
     * @param   data 响应数据集
     * @return       是否可用标志
     */
    function checkData(data){
      var isNull = true;
      //数据非数组,切数组长度为0 为不可用
      if(is.not.array(data) || data.length === 0){
        return isNull;
      }
      //遍历数据数组
      angular.forEach(data,function(item){
        if(!isNull) {
          return;
        }
        //遍历每个子数组,只要有一项满足条件,则数据可用
        angular.forEach(item.data,function(subItem){
          //当子数组中的元素的业务量不为0 则满足条件
          if(subItem.tradeAmount !== 0){
            isNull = false;
            return;
          }
        });
      });
      return isNull;
    }

    //获取页面展示对象
    function getViewObj(){
      viewObj = {
        series:{},
        rsp:{},
        duration:''
      };
      return viewObj;
    }

    //获取交易类型
    function getTradeType(){
      return tradeType;
    }

    /**
     * 设置账期区间
     * @param  param 查询参数对象
     */
    function setDuration(param){
      viewObj.duration = BusAssessmentService.getDuration(param);
      return viewObj.duration;
    }

    /**
     * 设置交易返回码
     * @param   data             响应数据
     * @param   isBankCorporate  业务线是否为银行总对总
     * @return                   交易返回码数据集
     */
    function setRsp(data,isBankCorporate){
      viewObj.rsp = {};
      //遍历响应得到的数据,进行相应赋值操作
      angular.forEach(data,function(item){
        //如果业务线为银行总对总,则分交易类型进行赋值
        if(isBankCorporate){
          viewObj.rsp[item.tradeType] = item['rsp_code'];
        }else{
          viewObj.rsp = item['rsp_code'];
        }
      });
      return viewObj.rsp;
    }

    /**
     * 设置展示数据集
     * @param   data            响应数据集
     * @param   isBankCorporate 业务线标志
     */
    function setSeries(data,isBankCorporate){
      viewObj.series = {};
      //遍历响应数据,初始化viewObj.series
      angular.forEach(data,function(item){
        //遍历子集
        angular.forEach(item.data,function(subItem){
          //给页面数据对象中的series以省份代码为key赋值对象
          viewObj.series[subItem.provinceCode] = {
            provinceName:subItem.provinceName, //省份名称
            provinceCode:subItem.provinceCode  //省份代码
          };
        });
      });
      //判别业务线
      if(isBankCorporate){
        //遍历响应数据
        angular.forEach(data,function(item){
          //遍历子集
          angular.forEach(item.data,function(subItem){
            //这里对已生成的每一个对象再以交易类型代码为key赋值数据对象
            viewObj.series[subItem.provinceCode][item.tradeType] = subItem;
          });
        });
        //重新遍历页面数据对象
        angular.forEach(viewObj.series,function(item){
          //如果不存在缴费或签约其中一项交易的考核,则初始化空数据供页面展示
          if(!item[tradeType.constract]){
            item[tradeType.constract] = {
              'rsp_value':viewObj.rsp[tradeType.constract].map(function(){ return '';})
            };
          }else if(!item[tradeType.payment]){
            item[tradeType.payment] = {
              'rsp_value':viewObj.rsp[tradeType.payment].map(function(){ return '';})
            };
          }
        });
      }else{
        //遍历响应数据
        angular.forEach(data,function(item){
          //遍历子集
          angular.forEach(item.data,function(subItem){
            //这里对已生成的每一个对象再以交易类型代码为key赋值数据对象
            viewObj.series[subItem.provinceCode].data = subItem;
          });
        });
      }
      return viewObj.series;
    }
  }

  provAViewObj.$inject = ['BusAssessmentService'];

})();
